#ifndef SAVEBASE_H
#define SAVEBASE_H

#include <QObject>
#include <QFile>
#include <QStorageInfo>
#include <QDateTime>

#include "head.h"

/***
 * 存储基类
 * */

class SaveBase : public QObject
{
    Q_OBJECT
public:
    explicit SaveBase(QObject *parent = nullptr);

    void setSaveStatus(bool status);        //设置保存状体，开始（true）还是暂停（false）

    bool getSaveStatus() const;           //获取运行状态

    void setInfo(VIDEO_SAVE_CONFIG config, QString fileSavePath, QStringList diskPaths);     //设置基本信息

    bool checkAndSwitchDisk(); //检查磁盘

    bool m_saveStatues;   //开始还是暂停

    bool m_creatDir;    //是否创建文件夹

    QFile m_file;       //存储的具体文件

    QString m_srcIP;    //ini配置文件中的过滤来源ip

    QString m_desc;     //存储文件的前缀

    QString m_videoName;//存储文件的名称

    quint16 m_bindPort; //ini配置中过滤收到的ip端口

    QString m_fileSavePath;     //基础存储路径（非磁盘路径）

    QTimer* m_fileTimer;        //定时关闭文件的操作，从而控制时长(仅保存h264文件有效)

    int m_splitTimeMinutes;     //每个视频的分割时长(仅保存h264文件有效)

    //磁盘管理相关
    int m_currentDiskIndex;     //当前使用的磁盘索引（0-3对应disk1-disk4）

    QList<QString> m_diskPaths; //磁盘路径列表（如["disk1", "disk2", "disk3", "disk4"]）

    qint64 m_minFreeSpace;      //最小剩余空间阈值（字节，如100MB）

    SaveIndex m_saveMethod;  //解析协议的格式

    QDateTime m_fileStartTime;  //开始时间，用于更新保存得文件名

signals:
    void sigDiskFull(const QString &diskName); // 磁盘满信号

    void sigAllDiskFull();  //所有磁盘满信号

    void sigStopTimer();        //停止定时器信号

    void sigToInitTimer();      //通知初始化定时器

    //测试，显示视频
    void sigToShowImg(const QString ip, const quint16 port, const QByteArray arr);

public slots:
    //提供空函数，因为槽函数不能纯虚
    virtual void onWorking(const QString ip, const quint16 port, const QByteArray arr){}

    virtual void onInitTimer(){}     //初始化定时器
};

#endif // SAVEBASE_H
